package com.gm.lib.utils;

import android.widget.ImageView;

import com.gm.common.utils.ResUtil;
import com.gm.lib.R;
import com.gm.lib.views.CircleBitmapDisplayer;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageSize;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;

/**
 * Created by cx on 15/4/21.
 */
public class GMImageLoaderIUtil {


    protected static ImageLoader imageLoader = ImageLoader.getInstance();


    /**
     * 默认的属性。打开 内存 和 sd 卡的缓存
     */
    private static DisplayImageOptions mOptions = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisc(true)
            .showStubImage(R.drawable.img_loading).showImageForEmptyUri(R.drawable.img_loading)
            .showImageOnFail(R.drawable.img_loading).build();


    /**
     * 异步加载图片的基类
     *
     * @param imageUrl
     * @param imageView
     * @param options
     * @param simpleImageLoadingListener
     */
    public static void loadImage(String imageUrl, ImageView imageView, DisplayImageOptions options,
                                 SimpleImageLoadingListener simpleImageLoadingListener) {
        imageLoader.displayImage(imageUrl, imageView, options, simpleImageLoadingListener);
    }


    public static void clearAllCache() {
        clearDiscCache();
        clearMemoryCache();
    }

    public static void clearDiscCache() {
        imageLoader.clearDiscCache();
    }

    public static void clearMemoryCache() {
        imageLoader.clearMemoryCache();
    }

    /**
     * 最简单的仅获取图片的方法。在接口回调里的 onLoadingComplete 取得图片
     *
     * @param imageUrl
     * @param simpleImageLoadingListener
     */
    public static void loadImage(String imageUrl, SimpleImageLoadingListener simpleImageLoadingListener) {
        imageLoader.loadImage(imageUrl, null, null, simpleImageLoadingListener);
    }

    public static void loadImage(String imageUrl, DisplayImageOptions options,
                                 SimpleImageLoadingListener simpleImageLoadingListener) {
        imageLoader.loadImage(imageUrl, null, options, simpleImageLoadingListener);
    }


    /**
     * 不需要回调的加载图片，可以传入DisplayImageOptions
     *
     * @param imageUrl
     * @param imageView
     * @param options
     */
    public static void loadImage(String imageUrl, ImageView imageView, DisplayImageOptions options) {
        loadImage(imageUrl, imageView, options, null);
    }

    /**
     * 带回调的加载图片。回调的接口可以用于监听加载前，加载完的状态，以实现类似效果：图片加载前显示进度条，图片加载完进度条消失
     *
     * @param imageUrl
     * @param imageView
     * @param simpleImageLoadingListener
     */
    public static void loadImage(String imageUrl, ImageView imageView,
                                 SimpleImageLoadingListener simpleImageLoadingListener) {
        loadImage(imageUrl, imageView, mOptions, simpleImageLoadingListener);
    }


    public static String getImageUrlByType(String imageUrl,ImageLoaderType type){

        if (type == ImageLoaderType.FILE) {
            //本地的，要拼凑前面的
            if (!imageUrl.startsWith("file://")) {
                if (imageUrl.startsWith("/")) {
                    imageUrl = "file://" + imageUrl;
                } else {
                    imageUrl = "file:///" + imageUrl;
                }
            }
        } else if(type==ImageLoaderType.HTTP) {
            //默认

        }
        return imageUrl;
    }

    /**
     * 加载本地的图片
     *
     * @param imageUrl
     * @param imageView
     */
    public static void loadImage(String imageUrl, ImageView imageView, ImageLoaderType type) {

        loadImage(getImageUrlByType(imageUrl,type), imageView, mOptions);
    }

    /**
     * 不需要回调的加载图片，应该是最常用的
     *
     * @param imageUrl
     * @param imageView
     */
    public static void loadImage(String imageUrl, ImageView imageView) {
        loadImage(imageUrl, imageView, mOptions);
    }

    public static void loadImage(String imageUrl, ImageView imageView, int defaultImg) {
        loadImage(imageUrl, imageView, new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisc(true)
                .showStubImage(defaultImg).showImageForEmptyUri(defaultImg).showImageOnFail(defaultImg).build());
    }


    public static void loadImage(String imageUrl, ImageSize imageSize,
                                 SimpleImageLoadingListener simpleImageLoadingListener) {
        imageLoader.loadImage(imageUrl, imageSize, mOptions, simpleImageLoadingListener);
    }

    public static void loadImageCircle(String imageUrl, ImageView imageView) {
        loadImage(imageUrl, imageView, getOptionsBuilder().resetViewBeforeLoading(true).displayer(new CircleBitmapDisplayer()).build());
    }


    public static void loadImageCircle(String imageUrl, ImageView imageView,int defaultResId) {
        loadImage(imageUrl, imageView, getOptionsBuilder().showImageOnLoading(defaultResId).showStubImage(defaultResId).showImageForEmptyUri(defaultResId)
                .showImageOnFail(defaultResId).resetViewBeforeLoading(true).displayer(new CircleBitmapDisplayer()).build());
    }


    public static void loadImageCircleWithBorder(String imageUrl, ImageView imageView,int defaultResId) {
        loadImage(imageUrl, imageView, getOptionsBuilder().showImageOnLoading(defaultResId).showStubImage(defaultResId).showImageForEmptyUri(defaultResId)
                .showImageOnFail(defaultResId).resetViewBeforeLoading(true).displayer(new CircleBitmapDisplayer(ResUtil.getColor(R.color.white),5)).build());
    }

    public static DisplayImageOptions.Builder getOptionsBuilder() {
        return new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisc(true).showImageOnLoading(R.drawable.img_loading)
                .showStubImage(R.drawable.img_loading).showImageForEmptyUri(R.drawable.img_loading)
                .showImageOnFail(R.drawable.img_loading);
    }

    // DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.
    // DisplayImageOptions options = new DisplayImageOptions.Builder()
    // .showImageOnLoading(R.drawable.ic_stub) // resource or drawable
    // .showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable
    // .showImageOnFail(R.drawable.ic_error) // resource or drawable
    // .resetViewBeforeLoading(false) // default
    // .delayBeforeLoading(1000)
    // .cacheInMemory(false) // default
    // .cacheOnDisc(false) // default
    // .preProcessor(...)
    // .postProcessor(...)
    // .extraForDownloader(...)
    // .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
    // .bitmapConfig(Bitmap.Config.ARGB_8888) // default
    // .decodingOptions(...)
    // .displayer(new SimpleBitmapDisplayer()) // default
    // .handler(new Handler()) // default
    // .build();
}
